package com.ruoyi.psi.base.cost.service;

import com.ruoyi.common.utils.StringUtils;

import com.ruoyi.psi.base.cost.domain.*;
import com.ruoyi.psi.base.cost.mapper.ProductionCostMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 生产报价
 * 业务处理层
 */
@Service
public class ProductionCostServiceImpl implements IProductionCostService{
    @Autowired
    private ProductionCostMapper productionCostMapper;

    /**
     * 根据搜索条件查询所有产品成本信息
     * @param cond 搜索条件
     * @return
     */
    @Override
    public List<ProductionCostDto> selectProductionCostList(ProductionCostCond cond) {
        List<ProductionCostDto> productionCostDtos = productionCostMapper.selectProductionCostList(cond);
        for (int i = 0; i < productionCostDtos.size(); i++) {
            // 判断子表是否存在
            if (StringUtils.isNotNull(productionCostMapper.selectProductionCostListListById(productionCostDtos.get(i).getProduceId()))) {
                List<ProductionCostListDto> productionCostListDtos = productionCostMapper.selectProductionCostListListById(productionCostDtos.get(i).getProduceId());
                for (ProductionCostListDto p : productionCostListDtos) {
                    // 计算子表总成本
                    double costPrice = p.getCostNumber() * p.getCostUnitPrice();
                    p.setCostPrice(costPrice);
                }
                // 设置子表
                productionCostDtos.get(i).setProductionCostListDto(productionCostListDtos);
            }
        }
        return productionCostDtos;
    }

    /**
     * 按编号查询具体的产品成本信息
     * @param produceId
     * @return
     */
    @Override
    public ProductionCostDto selectProductionCostById(String produceId) {
        return productionCostMapper.selectProductionCostById(produceId);
    }

    /**
     * 新增产品成本记录
     * @param productionCost
     * @return
     */
    @Override
    public int insertProductionCost(ProductionCostDomain productionCost) {
        if (StringUtils.isNotNull(productionCostMapper.selectProductionCostById(productionCost.getProduceId()))) {
            //存在
            return 0;
        }
        //不存在
        // 添加明细信息
        double totalCost = 0.00;
        List<ProductionCostListDomain> productionCostListDomainList = productionCost.getProductionCostListDomain();
        for (int i = 0; i < productionCostListDomainList.size(); i++) {
            // 计算子表总成本
            double costPrice = productionCostListDomainList.get(i).getCostUnitPrice() * productionCostListDomainList.get(i).getCostNumber();
            // 累加总成本
            totalCost += costPrice;
            productionCostMapper.insertProductionCostList(productionCostListDomainList.get(i));
        }
//        System.out.println("累计成本" + totalCost);
        // 根据子表的信息添加总成本
        productionCost.setTotalCost(totalCost);
        // 添加主表
//        System.out.println("最后添加时的对象状态" + productionCost);
        productionCostMapper.insertProductionCost(productionCost);
        return 1;
    }

    /**
     * 修改产品成本记录
     * @param productionCost
     * @return
     */
    @Override
    public int updateProductionCost(ProductionCostDomain productionCost) {
        if (!StringUtils.isNotNull(productionCostMapper.selectProductionCostById(productionCost.getProduceId()))) {
            //不存在
            return 0;
        }
        //存在
        productionCostMapper.updateProductionCost(productionCost);
        // 从数据库中查询已有的数据
        List<ProductionCostListDto> productionCostListDtos = productionCostMapper.selectProductionCostListListById(productionCost.getProduceId());
//        System.out.println("数据库中查询的数据" + productionCostListDtos);
        // 查询前端传入的修改数据
        List<ProductionCostListDomain> productionCostListDomain = productionCost.getProductionCostListDomain();
//        System.out.println("查询前端传入的修改数据" + productionCost);
        for (int i = 0; i < productionCostListDomain.size(); i++) {
            // 获取指定的明细
            ProductionCostListDto productionCostListDto = productionCostMapper.selectProductionCostListById(productionCost.getProduceId(), productionCostListDomain.get(i).getCostItemId());
//            System.out.println("具体的修改对象" + productionCostListDto);
            if (StringUtils.isNotNull(productionCostListDto)) {
                // 存在指定的明细
                for (int j = 0; j < productionCostListDtos.size(); j++) {
                    if (productionCostListDtos.get(j).getCostItemId().equals(productionCostListDto.getCostItemId())) {
                        productionCostListDtos.remove(j);
                        break;
                    }
                }
                productionCostMapper.updateProductionCostList(productionCostListDomain.get(i)); //更新
            } else {
                productionCostMapper.insertProductionCostList(productionCostListDomain.get(i)); //新增
            }
        }
        for (int i = 0; i < productionCostListDtos.size(); i++) {
            //删除新旧重叠以外的部分
            productionCostMapper.deleteProductionCostListById(productionCostListDtos.get(i).getProduceId(), productionCostListDtos.get(i).getCostItemId());
        }
        return 1;
    }

    /**
     * 删除产品成本记录
     * 仅修改删除标志
     * @param productionCost
     * @return
     */
    @Override
    public int updateProductionCostDeleteFlag(ProductionCostDomain productionCost) {
        return productionCostMapper.updateProductionCostDeleteFlag(productionCost);
    }

    /**
     * 产品成本详细查询
     * @param cond
     * @return
     */
    @Override
    public List<ProductionCostListDto> selectProductionCostListList(ProductionCostCond cond) {
        return productionCostMapper.selectProductionCostListList(cond);
    }

    /**
     * 查询产品成本对应的所有报价详细
     * @return
     */
    @Override
    public List<ProductionCostListDto> selectProductionCostListListById(String produceId) {
        List<ProductionCostListDto> productionCostListDtoList = productionCostMapper.selectProductionCostListListById(produceId);
        for (ProductionCostListDto p : productionCostListDtoList) {
            // 计算成本
            double costPrice = p.getCostUnitPrice() * p.getCostNumber();
            p.setCostPrice(costPrice);
        }
        return productionCostListDtoList;
    }

    /**
     * 查询产品成本对应的指定报价详细
     * @param produceId 产品编号
     * @param costItemId 成本项目编号
     * @return
     */
    @Override
    public ProductionCostListDto selectProductionCostListById(String produceId, Integer costItemId) {
        return productionCostMapper.selectProductionCostListById(produceId, costItemId);
    }
}
